home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2001 Spring / Oh!X 2001 Spring Special CD-ROM (Japan).7z / Oh!X 2001 Spring Special CD-ROM (Japan) (Track 1).bin / VC / layered2 / layered2.cpp < prev    next >
C/C++ Source or Header  |  2000-08-03  |  6KB  |  213 lines

  1. // layered2.cpp : アプリケーション用のエントリ ポイントの定義
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "layeredwnd.h"
  6.  
  7. #define APPNAME "LayeredWindow2"
  8. static char szAppName[] = APPNAME;
  9. static char szTitle[]   = APPNAME;
  10.  
  11. #define MM_QUIT WM_USER+1
  12.  
  13. LayeredWnd *playeredWnd;
  14.  
  15. HINSTANCE    hInst;    // USER32.DLL のインスタンスハンドル
  16. //    SetLayeredWindowAttributes のアドレス
  17. BOOL (WINAPI *_SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
  18.  
  19. int APIENTRY WinMain(HINSTANCE hInstance,
  20.                      HINSTANCE hPrevInstance,
  21.                      LPSTR     lpCmdLine,
  22.                      int       nCmdShow )
  23. {
  24.      // TODO: この位置にコードを記述してください。
  25.     OSVERSIONINFO versioninfo;
  26.     versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  27.     GetVersionEx( &versioninfo );
  28.     if( versioninfo.dwMajorVersion<5 ){
  29.         MessageBox( NULL, "このバージョンのWindowsでは動作しません。", "LayeredWindow",MB_OK|MB_ICONHAND ); 
  30.         return FALSE;
  31.     }
  32.     if( !InitInstance( hInstance ) ){
  33.         MessageBox( NULL, "アプリケーションの初期化に失敗しました。", "LayeredWindow", MB_OK|MB_ICONHAND );
  34.         return FALSE;
  35.     }
  36.  
  37.     MSG msg;
  38.     while( GetMessage( &msg, NULL, 0, 0 ) ){
  39.         TranslateMessage( &msg );    // Translates virtual key codes.
  40.         DispatchMessage( &msg );    // Dispatches message to window.
  41.     }
  42.     ExitInstance();
  43.     return msg.wParam;    // Returns the value from PostQuitMessage.
  44. }
  45.  
  46. BOOL InitInstance( HINSTANCE hInstance )
  47. {
  48.     // SetLayeredWindowAttributes のエクスポートアドレスの取得
  49.     hInst = LoadLibrary( "USER32.DLL" );
  50.     if( hInst ){
  51.         _SetLayeredWindowAttributes = (BOOL(WINAPI*)(HWND,COLORREF,BYTE,DWORD))
  52.             GetProcAddress( hInst, "SetLayeredWindowAttributes" );
  53.     }
  54.     if( _SetLayeredWindowAttributes==NULL ) return FALSE;
  55.  
  56.     playeredWnd = new LayeredWnd( hInstance );
  57.     HWND hWnd = playeredWnd->Create();
  58.     return hWnd?TRUE:FALSE;
  59. }
  60.  
  61. void ExitInstance()
  62. {
  63.     if( playeredWnd ) delete playeredWnd;
  64.     if( hInst ) FreeLibrary( hInst );
  65. }
  66.  
  67. LONG APIENTRY MainWndProc( HWND hWnd, UINT message, UINT wParam, LONG lParam )
  68. {
  69.     if( message==WM_NCCREATE ){
  70.         CREATESTRUCT *pcs = (CREATESTRUCT*)lParam;
  71.         SetWindowLong( hWnd, GWL_USERDATA, (LONG)pcs->lpCreateParams );
  72.     }
  73.     LayeredWnd *pWnd = (LayeredWnd*)GetWindowLong( hWnd, GWL_USERDATA );
  74.     if( pWnd==NULL ){
  75.         return DefWindowProc( hWnd, message, wParam, lParam );
  76.     } else {
  77.         return pWnd->WndProc( hWnd, message, wParam, lParam );
  78.     }
  79.     return 0;
  80. }
  81.  
  82. //////////////////////////////////////////////////////////////////////
  83. // LayeredWnd クラス
  84. //////////////////////////////////////////////////////////////////////
  85.  
  86. //////////////////////////////////////////////////////////////////////
  87. // 構築/消滅
  88. //////////////////////////////////////////////////////////////////////
  89.  
  90. LayeredWnd::LayeredWnd( HINSTANCE hInstance )
  91. {
  92.     WNDCLASSEX wc;
  93.     wc.cbSize = sizeof( WNDCLASSEX );
  94.     wc.style = 0;
  95.     wc.lpfnWndProc = (WNDPROC)MainWndProc;
  96.     wc.cbClsExtra = 0;
  97.     wc.cbWndExtra = 0;
  98.     wc.hInstance = hInstance;
  99.     wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  100.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  101.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  102.     wc.lpszMenuName = NULL;
  103.     wc.lpszClassName = szAppName;
  104.     wc.hIconSm = NULL;
  105.     RegisterClassEx( &wc );
  106.     m_hInstance = hInstance;
  107.  
  108.     m_hMenu = CreatePopupMenu();
  109.     MENUITEMINFO mi;
  110.     mi.cbSize = sizeof(MENUITEMINFO);
  111.     mi.fMask = MIIM_ID|MIIM_TYPE;
  112.     mi.fType = MFT_STRING;
  113.     mi.wID = MM_QUIT;
  114.     mi.dwTypeData = "終了";
  115.     mi.cch = strlen( mi.dwTypeData );
  116.     InsertMenuItem( m_hMenu, 0, TRUE, &mi );
  117.  
  118.     m_hBitmap = LoadBitmap( m_hInstance, MAKEINTRESOURCE(IDB_OHX) );
  119.     BITMAPINFOHEADER *pbmih = (BITMAPINFOHEADER*)GlobalAlloc( GPTR, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 );
  120.     memset( pbmih, 0, sizeof(BITMAPINFOHEADER) );
  121.     pbmih->biSize = sizeof(BITMAPINFOHEADER);
  122.     HDC hDC = GetDC( NULL );
  123.     GetDIBits( hDC, m_hBitmap, 0, 0, NULL, (BITMAPINFO*)pbmih, DIB_RGB_COLORS );
  124.     ReleaseDC( NULL, hDC );
  125.     m_nWidth = pbmih->biWidth;
  126.     m_nHeight = pbmih->biHeight;
  127.     GlobalFree( pbmih );
  128. }
  129.  
  130. LayeredWnd::~LayeredWnd()
  131. {
  132.     DestroyMenu( m_hMenu );
  133. }
  134.  
  135. HWND LayeredWnd::Create()
  136. {
  137.     CREATESTRUCT cs;
  138.     cs.lpCreateParams = this;
  139.     cs.hInstance = m_hInstance;
  140.     cs.hMenu = NULL;
  141.     cs.hwndParent = NULL;
  142.     cs.cy = m_nHeight;
  143.     cs.cx = m_nWidth;
  144.     cs.y = CW_USEDEFAULT;
  145.     cs.x = CW_USEDEFAULT;
  146.     cs.style = WS_POPUP|WS_VISIBLE;
  147.     cs.lpszName = szTitle;
  148.     cs.lpszClass = szAppName;
  149.     cs.dwExStyle = WS_EX_TOOLWINDOW|WS_EX_LAYERED;    // レイヤードウィンドウ
  150.     m_hWnd = CreateWindowEx( cs.dwExStyle, cs.lpszClass, cs.lpszName, cs.style,
  151.         cs.x, cs.y, cs.cx, cs.cy, cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams );
  152.     return m_hWnd;
  153. }
  154.  
  155. LRESULT LayeredWnd::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  156. {
  157.     switch( message ){
  158.     case WM_CREATE:
  159.         OnCreate( hWnd );
  160.         return 0;
  161.     case WM_DESTROY:
  162.         OnDestroy();
  163.         PostQuitMessage( 0 );
  164.         return 0;
  165.     case WM_PAINT:
  166.         OnPaint( (HDC)wParam );
  167.         return 0;
  168.     case WM_NCHITTEST:
  169.         return OnNcHitTest( LOWORD(lParam), HIWORD(lParam) );
  170.     case WM_NCRBUTTONDOWN:
  171.         OnNcRButtonDown( wParam, MAKEPOINTS(lParam) );
  172.         return 0;
  173.     case WM_COMMAND:
  174.         switch( LOWORD(wParam) ){
  175.         case MM_QUIT:
  176.             DestroyWindow( m_hWnd );
  177.             return 0;
  178.         }
  179.         break;
  180.     }
  181.     return DefWindowProc( hWnd, message, wParam, lParam );
  182. }
  183.  
  184. void LayeredWnd::OnCreate( HWND hWnd )
  185. {
  186.     _SetLayeredWindowAttributes( hWnd, RGB(0,0,0), 128, LWA_COLORKEY|LWA_ALPHA );
  187. }
  188.  
  189. void LayeredWnd::OnDestroy()
  190. {
  191. }
  192.  
  193. void LayeredWnd::OnPaint( HDC hDC )
  194. {
  195.     PAINTSTRUCT ps;
  196.     hDC = BeginPaint( m_hWnd, &ps );
  197.     HDC hMemDC = CreateCompatibleDC( NULL );
  198.     SelectObject( hMemDC, m_hBitmap );
  199.     BitBlt( hDC, 0, 0, m_nWidth, m_nHeight, hMemDC, 0, 0, SRCCOPY );
  200.     DeleteDC( hMemDC );
  201.     EndPaint( m_hWnd, &ps );
  202. }
  203.  
  204. int LayeredWnd::OnNcHitTest( int xPos, int yPos )
  205. {
  206.     return HTCAPTION;
  207. }
  208.  
  209. void LayeredWnd::OnNcRButtonDown( int nHittest, POINTS pts )
  210. {
  211.     TrackPopupMenu( m_hMenu, TPM_LEFTALIGN|TPM_TOPALIGN, pts.x, pts.y, 0, m_hWnd, NULL );
  212. }
  213.